💡 AI 인사이트

🤖 AI가 여기에 결과를 출력합니다...

댓글 커뮤니티

쿠팡이벤트

이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.

검색

    로딩 중이에요... 🐣

    [코담] 웹개발·실전 프로젝트·AI까지, 파이썬·장고의 모든것을 담아낸 강의와 개발 노트

    2 요약정리 | ✅ 저자: 이유정(박사)

    🕸️ BeautifulSoup 기반 웹 크롤링 예제 (CGV 영화)

    🧰 설치 명령어

    pip install beautifulsoup4
    pip install lxml
    pip list  # 설치 확인
    

    beautifulsoup4는 HTML 파서를 포함하지 않으므로 lxml 또는 html5lib를 함께 설치해야 합니다.

    🔍 CGV 영화 목록 크롤링 예시

    import requests
    from bs4 import BeautifulSoup
    
    def get_cgv_movies():
        url = "http://www.cgv.co.kr/movies/"
        headers = {
            "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36"
        }
        resp = requests.get(url, headers=headers)
        resp.raise_for_status()
        soup = BeautifulSoup(resp.text, "html.parser")
        chart_box = soup.select("div.sect-movie-chart ol li")
    
        result = []
        for movie in chart_box:
            title_tag = movie.select_one("strong.title")
            percent_tag = movie.select_one("strong.percent span")
            release_tag = movie.select_one("span.txt-info")
            img_tag = movie.select_one("img")
    
            if title_tag:
                result.append({
                    "title": title_tag.text.strip(),
                    "reserve_percent": percent_tag.text.strip() if percent_tag else None,
                    "release_date": release_tag.text.strip() if release_tag else None,
                    "poster": img_tag["src"] if img_tag else None
                })
    
        return result
    
    if __name__ == "__main__":
        movies = get_cgv_movies()
        for i, m in enumerate(movies, 1):
            print(f"{i}. {m['title']} ({m['release_date']}) - 예매율: {m['reserve_percent']}")
            
    

    🧾 주요 파싱 전략

    기준 설명 및 예시
    태그 이름 <div>, <span> 등 → soup.find('div')
    클래스(class) .title, .txt-info 등 → soup.select('.title')
    id 속성 #mainsoup.select('#main')
    위치 기반 탐색 div > ul > lisoup.select('div.box > ul > li')
    속성값 기준 href, src 등 → soup.find('a', href=True)
    텍스트 내용 "CGV" in tag.text

    ✨ 메서드 정리

    • find() / find_all() : 태그 기반 탐색

    • select() / select_one() : CSS 선택자 기반 탐색

    ▶ 실행 예제

    if __name__ == "__main__":
        movies = get_cgv_movies()
        for i, m in enumerate(movies, 1):
            print(f"{i}. {m['title']} ({m['release_date']}) - 예매율: {m['reserve_percent']}")
    

    예상 출력:

    1. 쥬라기 월드: 새로운 시작 (2025.07.02 개봉) - 예매율: 32.7%
    2. F1 더 무비 (2025.06.25 개봉) - 예매율: 23.3%
    3. 노이즈 (2025.06.25 개봉) - 예매율: 6.2%
    4. 드래곤 길들이기 (2025.06.06 개봉) - 예매율: 2.0%
    5. 엘리오 (2025.06.18 개봉) - 예매율: 1.3%
    6. 28년 후 (2025.06.19 개봉) - 예매율: 1.2%
    7. 위장수사 (2025.06.27 개봉) - 예매율: 1.1%
    8. 바람계곡의 나우시카 (2025.06.25 개봉) - 예매율: 1.0%
    9. 바다호랑이 (2025.06.25 개봉) - 예매율: 0.8%
    10. 인피니트 15주년 콘서트 리미티드 에디션 더 무비 (2025.06.11 개봉) - 예매율: 0.6%
    11. 그림자 군단 (2025.07.02 재개봉) - 예매율: 0.3%
    12. 그을린 사랑 (2025.06.25  재개봉) - 예매율: 0.2%
    13. 퀴어 (2025.06.20  개봉) - 예매율: 0.2%
    14. 미션 임파서블: 파이널 레코닝 (2025.05.17 개봉) - 예매율: 0.2%
    15. 하이파이브 (2025.05.30 개봉) - 예매율: 0.2%
    16. 해피엔드 (2025.04.30 개봉) - 예매율: 0.2%
    17. 인생은 아름다워 (2025.06.11 재개봉) - 예매율: 0.2%
    18. 사스콰치 선셋 (2025.07.02 개봉) - 예매율: 0.1%
    19. 네이키드 런치 (2025.06.25 개봉) - 예매율: 0.1%
    

    TOP
    preload preload